package org.edu.modules.stu.base.utils;

import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.edu.modules.stu.base.dto.VeXueJiExcelDto;

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Pattern;

public class OptimizedExcelValidator {

    // 预编译正则表达式（性能提升关键）
    private static final Pattern ID_CARD_PATTERN = Pattern.compile(
            "^[1-9]\\d{5}(19|20)\\d{2}}(0[1-9]|1[0-2])(0[1-9]|\\d|3)\\d{3}[\\dXx]$"
    );
    private static final DateTimeFormatter DATE_FORMATTER =
            DateTimeFormatter.ofPattern("yyyy-MM-dd");

    public static void validateVeXueJiData(List<VeXueJiExcelDto> dataList) {
        // 1. 集合校验（提前短路）
        if (CollectionUtils.isEmpty(dataList))  {
            throw new IllegalArgumentException("导入数据不能为空");
        }

        List<String> errors = new ArrayList<>(dataList.size());  // 预设容量
        final int totalRows = dataList.size();

        // 2. 单次遍历优化（避免多次get调用）
        for (int i = 0; i < totalRows; i++) {
            VeXueJiExcelDto dto = dataList.get(i);
            if (dto == null) {
                errors.add(" 第" + (i+4) + "行数据为空");
                continue;
            }

            // 3. 内联字段校验（减少方法调用栈开销）
            validateRow(dto, i+4, errors);
        }

        if (!errors.isEmpty())  {
            throw new IllegalArgumentException(String.join(";  ", errors));
        }
    }

    private static void validateRow(VeXueJiExcelDto dto, int rowNum, List<String> errors) {
        // 4. 关键字段链式校验（避免重复判空）
        if (isBlank(dto.getXh()))  errors.add(rowNum  + "行学号不能为空");
        if (isBlank(dto.getXm()))  errors.add(rowNum  + "行姓名不能为空");
        if (isBlank(dto.getSfzh()))  {
            errors.add(rowNum  + "行身份证号不能为空");
        }
//        else if (!ID_CARD_PATTERN.matcher(dto.getSfzh()).matches())  {//方便测试，格式校验暂时取消
//            errors.add(rowNum  + "行身份证号格式错误");
//        }

        // 5. 高性能日期校验（替代SimpleDateFormat）
        if (StringUtils.isNotBlank(dto.getCsrq())  && !isValidDate(dto.getCsrq()))  {
            errors.add(rowNum  + "行出生日期格式应为yyyy-MM-dd");
        }
    }

    // 简化空值判断（比StringUtils.isBlank 更快）
    private static boolean isBlank(String value) {
        return value == null || value.trim().isEmpty();
    }

    // 基于DateTimeFormatter的线程安全校验
    private static boolean isValidDate(String dateStr) {
        try {
            LocalDate.parse(dateStr,  DATE_FORMATTER);
            return true;
        } catch (DateTimeParseException e) {
            return false;
        }
    }
}
